/**
*Createed by yellowTT's game
*FileName:     HierarchySceneObjectTool.cs
*Author:       yellowTT
*UnityVersion：5.6.0f3
*Date:         2019年04月22日,Monday, 10时51分39秒
*/

//using System.Collections;
//using System.Collections.Generic;
//using System;
//using System.Reflection;
//using UnityEngine;
//using UnityEditor;
//using System.IO;
//using System.Linq;
//using ProjectX.Interactions;
//using ProjectX.AI;
//using ProjectX;

//public class HierarchySceneObjectTool : Editor {
//    #region vignette
//    static List<VignetteInteractable> vignetteList = new List<VignetteInteractable>();
    
//    [MenuItem("Tools/伪装小站数据 &q", false, 100)]
//    public static void GetVignetteData()
//    {
//        vignetteList.Clear();
//        var allTransforms = Resources.FindObjectsOfTypeAll(typeof(Transform));
//        var previousSelection = Selection.objects;
//        Selection.objects = allTransforms.Cast<Transform>()
//            .Where(x => x != null && x.GetComponent<VignetteInteractable>() != null)
//            .Select(x => x.gameObject)
//            //.Where(x => x != null && !x.activeInHierarchy)
//            .Cast<UnityEngine.Object>().ToArray();

//        Transform[] selectedTransforms = Selection.GetTransforms(SelectionMode.Unfiltered);
//        Selection.objects = previousSelection;

//        foreach (Transform obj in selectedTransforms)
//        {
//            GameObject ob = obj.gameObject;
//            vignetteList.Add(obj.GetComponent<VignetteInteractable>());
//        }
//        //vignetteList.Add(selectedTransforms[0].GetComponent<VignetteInteractable>());
//        RecodeVignette();
//    }

//    static string url_vignette = Application.dataPath + "/vignette.csv";
//    static void RecodeVignette()
//    {
//        if (File.Exists(url_vignette)) {
//            File.Delete(url_vignette);
//        }
 
//        FileStream fs = new FileStream(url_vignette, FileMode.Append);
//        StreamWriter sw = new StreamWriter(fs);
//        int count = vignetteList.Count;

//        //字段名列表
//        List<string> nameList = new List<string>();
//        //属性值列表
//        Dictionary<int, List<object>> attrList = new Dictionary<int, List<object>>();
//        for (int i = 0; i < vignetteList.Count; i++)
//        {
//            attrList.Add(i, new List<object>());

//            VignetteInteractable vi = vignetteList[i];
//            Type type = vi.GetType();
//            //ProjectX.Interactions.VignetteInteractable
//            FieldInfo[] fieldInfos = type.GetFields(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public);

//            bool shouldAddName = nameList.Count <= 0;
            
//            foreach(FieldInfo fi in fieldInfos)
//            {
//                if (shouldAddName)
//                {
//                    nameList.Add(fi.Name);
//                }
                
//                attrList[i].Add(fi.GetValue(vi));
//            }

//            //collidersize
//            Collider col = vi.transform.GetComponentInChildren<Collider>();
//            Type colType = col.GetType();
//            object size = null;
//            if (colType == typeof(BoxCollider))
//            {
//                size = (col as BoxCollider).size;
//            }
//            else if (colType == typeof(SphereCollider))
//            {
//                size = (col as SphereCollider).radius;
//            }
//            //interactPoint
//            List<Vector3> interactsPos = new List<Vector3>();
//            List<Vector3> interactsRotation = new List<Vector3>();
//            for (int childIndex = 0; childIndex < vi.transform.childCount; childIndex++) {
//                Transform child = vi.transform.GetChild(childIndex);
//                if (child.name.ToLower().Contains("interactpoint")) {
//                    interactsPos.Add(child.localPosition);
//                    interactsRotation.Add(child.localRotation.eulerAngles);
//                }
//            }

//            //单独添加坐标，方向，boxCollider属性
//            if (shouldAddName)
//            {
//                nameList.Add("ColliderSize");
//                nameList.Add("ColliderPosition");
//                nameList.Add("ColliderType");

//                nameList.Add("InteractPointsPosition");
//                nameList.Add("InteractPointsRotation");

//                nameList.Add("position");
//                nameList.Add("rotation");
//                nameList.Add("name");
//                nameList.Add("sceneName");

//            }

//            attrList[i].Add(size);
//            attrList[i].Add(col.transform.localPosition);
//            attrList[i].Add(colType.Name);

//            //InteractPointsPosition/InteractPointsRotation
//            string str = "\"";
//            foreach (Vector3 v in interactsPos) {
//                str += v.ToString()+",";
//            }
//            str += "\"";
//            attrList[i].Add(str);

//            string str1 = "\"";
//            foreach (Vector3 v in interactsRotation)
//            {
//                str1 += v.ToString() + ",";
//            }
//            str1 += "\"";
//            attrList[i].Add(str1);

//            attrList[i].Add(vi.transform.localPosition);
//            attrList[i].Add(vi.transform.rotation.eulerAngles);
//            attrList[i].Add(vi.transform.name);
//            attrList[i].Add(UnityEngine.SceneManagement.SceneManager.GetActiveScene().name);

//            //FieldInfo ufdFi = type.GetField("useFaceDirection", BindingFlags.Instance | BindingFlags.NonPublic);
//            //FieldInfo fdFi = type.GetField("faceDirection", BindingFlags.Instance | BindingFlags.NonPublic);

//            //sw.WriteLine(string.Format("名字:{0}", vi.transform.name));
//            //sw.WriteLine(string.Format("坐标:{0}", vi.transform.position.ToString()));
//            //sw.WriteLine(string.Format("方向:{0}", vi.transform.rotation.eulerAngles.ToString()));
//            //sw.WriteLine(string.Format("useFaceDirection:{0}", ufdFi.GetValue(vi).ToString()));
//            //sw.WriteLine(string.Format("faceDirection:{0}", fdFi.GetValue(vi).ToString()));
//            //sw.WriteLine(string.Format(""));
//        }
//        for (int index = 0; index < nameList.Count; index++)
//        {
//            sw.Write(string.Format("{0},", nameList[index]));
//        }

//        Type vec3Tp = typeof(Vector3);
//        Type enumTp = typeof(Enum);
//        Type colorTp = typeof(Color);
//        Type colorArrayTp = typeof(Color[]);
        

//        for (int i = 0; i < attrList.Count; i++) {
//            List<object> value = attrList[i];
//            sw.WriteLine(string.Format(""));
//            for (int index = 0; index < value.Count; index++)
//            {
//                object target = value[index];
//                Type objT = target.GetType();
//                if (objT == vec3Tp || objT == colorTp)
//                {
//                    sw.Write(string.Format("\"{0}\",", target.ToString()));
//                }
//                else if (objT.IsEnum)
//                {
//                    //ProjectX.Interactions.VignetteInteractable+IndicatorState
//                    //Debug.Log(objT);
//                    sw.Write(string.Format("枚举值：{0},", target.ToString()));
//                }
//                else
//                {
//                    //sw.Write(string.Format("{0},", value[index].ToString()));
//                    sw.Write(string.Format("{0},", target.ToString()));
//                }
//            }
//            EditorUtility.DisplayProgressBar("写入中", i.ToString() + "/" + count.ToString(), (i + 1) / count);
//        }

//        EditorUtility.ClearProgressBar();
//        sw.Flush();
//        sw.Close();
//        fs.Close();
//        vignetteList.Clear();
//    }
//    #endregion

//    #region relife
//    static List<SpawnLocation> relifeList = new List<SpawnLocation>();
//    [MenuItem("Tools/重生点数据 &w", false, 100)]
//    public static void GetRelifeData()
//    {
//        relifeList.Clear();
//        var allTransforms = Resources.FindObjectsOfTypeAll(typeof(Transform));
//        var previousSelection = Selection.objects;
//        Selection.objects = allTransforms.Cast<Transform>()
//            .Where(x => x != null && x.GetComponent<SpawnLocation>() != null)
//            .Select(x => x.gameObject)
//            //.Where(x => x != null && !x.activeInHierarchy)
//            .Cast<UnityEngine.Object>().ToArray();

//        Transform[] selectedTransforms = Selection.GetTransforms(SelectionMode.Unfiltered);
//        Selection.objects = previousSelection;

//        foreach (Transform obj in selectedTransforms)
//        {
//            GameObject ob = obj.gameObject;
//            relifeList.Add(obj.GetComponent<SpawnLocation>());
//        }
//        RecodeRelife();
//    }

//    static string url_relife = Application.dataPath + "/relife.csv";
//    static void RecodeRelife()
//    {
//        if (File.Exists(url_relife))
//        {
//            File.Delete(url_relife);
//        }
//        FileStream fs = new FileStream(url_relife, FileMode.Append);
//        StreamWriter sw = new StreamWriter(fs);
//        int count = relifeList.Count;

//        //字段名列表
//        List<string> nameList = new List<string>();
//        //属性值列表
//        Dictionary<int, List<object>> attrList = new Dictionary<int, List<object>>();
//        for (int i = 0; i < relifeList.Count; i++)
//        {
//            attrList.Add(i, new List<object>());

//            SpawnLocation vi = relifeList[i];
//            Type type = vi.GetType();
//            //ProjectX.Interactions.VignetteInteractable
//            FieldInfo[] fieldInfos = type.GetFields(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public);

//            bool shouldAddName = nameList.Count <= 0;

//            foreach (FieldInfo fi in fieldInfos)
//            {
//                if (shouldAddName)
//                {
//                    nameList.Add(fi.Name);
//                }

//                if (fi.GetValue(vi) == null)
//                {
//                    attrList[i].Add("空值");
//                }
//                else {
//                    attrList[i].Add(fi.GetValue(vi));
//                }
//            }

//            //单独添加额外属性
//            if (shouldAddName)
//            {
//                nameList.Add("position");
//                nameList.Add("rotation");
//                nameList.Add("name");
//                nameList.Add("sceneName");
//            }

//            attrList[i].Add(vi.transform.localPosition);
//            attrList[i].Add(vi.transform.rotation.eulerAngles);
//            attrList[i].Add(vi.transform.name);
//            attrList[i].Add(UnityEngine.SceneManagement.SceneManager.GetActiveScene().name);
//        }
//        for (int index = 0; index < nameList.Count; index++)
//        {
//            sw.Write(string.Format("{0},", nameList[index]));
//        }

//        Type vec3Tp = typeof(Vector3);
//        Type enumTp = typeof(Enum);
//        Type colorTp = typeof(Color);
//        Type colorArrayTp = typeof(Color[]);


//        for (int i = 0; i < attrList.Count; i++)
//        {
//            List<object> value = attrList[i];
//            sw.WriteLine(string.Format(""));
//            for (int index = 0; index < value.Count; index++)
//            {
//                object target = value[index];
//                if (target == null) {
//                    continue;
//                }
//                Type objT = target.GetType();
//                if (objT == vec3Tp || objT == colorTp)
//                {
//                    sw.Write(string.Format("\"{0}\",", target.ToString()));
//                }
//                else if (objT.IsEnum)
//                {
//                    //ProjectX.Interactions.VignetteInteractable+IndicatorState
//                    sw.Write(string.Format("枚举值：{0},", target.ToString()));
//                }
//                else
//                {
//                    //sw.Write(string.Format("{0},", value[index].ToString()));
//                    sw.Write(string.Format("{0},", target.ToString()));
//                }
//            }
//            EditorUtility.DisplayProgressBar("写入中", i.ToString() + "/" + count.ToString(), (i + 1) / count);
//        }

//        EditorUtility.ClearProgressBar();
//        sw.Flush();
//        sw.Close();
//        fs.Close();
//        vignetteList.Clear();
//    }
//    #endregion

//    #region npc
//    static List<NPCSpawner> npcList = new List<NPCSpawner>();
//    [MenuItem("Tools/NPC数据 &e", false, 100)]
//    public static void GetNpcData()
//    {
//        npcList.Clear();
//        var allTransforms = Resources.FindObjectsOfTypeAll(typeof(Transform));
//        var previousSelection = Selection.objects;
//        Selection.objects = allTransforms.Cast<Transform>()
//            .Where(x => x != null && x.GetComponent<NPCSpawner>() != null)
//            .Select(x => x.gameObject)
//            //.Where(x => x != null && !x.activeInHierarchy)
//            .Cast<UnityEngine.Object>().ToArray();

//        Transform[] selectedTransforms = Selection.GetTransforms(SelectionMode.Unfiltered);
//        Selection.objects = previousSelection;

//        foreach (Transform obj in selectedTransforms)
//        {
//            GameObject ob = obj.gameObject;
//            npcList.Add(obj.GetComponent<NPCSpawner>());
//        }
//        RecodeNpc();
//    }

//    static string url_npc = Application.dataPath + "/npc.csv";
//    static void RecodeNpc()
//    {
//        if (File.Exists(url_npc))
//        {
//            File.Delete(url_npc);
//        }
//        FileStream fs = new FileStream(url_npc, FileMode.Append);
//        StreamWriter sw = new StreamWriter(fs);
//        int count = npcList.Count;
//        //字段名列表
//        List<string> nameList = new List<string>();
//        //属性值列表
//        Dictionary<int, List<object>> attrList = new Dictionary<int, List<object>>();
//        for (int i = 0; i < npcList.Count; i++)
//        {
//            attrList.Add(i, new List<object>());

//            NPCSpawner vi = npcList[i];
//            Type type = vi.GetType();
//            //ProjectX.Interactions.VignetteInteractable
//            FieldInfo[] fieldInfos = type.GetFields(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public);

//            bool shouldAddName = nameList.Count <= 0;

//            foreach (FieldInfo fi in fieldInfos)
//            {
//                if (shouldAddName)
//                {
//                    nameList.Add(fi.Name);
//                }

//                if (fi.GetValue(vi) == null)
//                {
//                    attrList[i].Add("空值");
//                }
//                else
//                {
//                    attrList[i].Add(fi.GetValue(vi));
//                }
//            }

//            //单独添加额外属性
//            if (shouldAddName)
//            {
//                nameList.Add("position");
//                nameList.Add("rotation");
//                nameList.Add("name");
//                nameList.Add("sceneName");
//            }

//            attrList[i].Add(vi.transform.localPosition);
//            attrList[i].Add(vi.transform.rotation.eulerAngles);
//            attrList[i].Add(vi.transform.name);
//            attrList[i].Add(UnityEngine.SceneManagement.SceneManager.GetActiveScene().name);
//        }
//        for (int index = 0; index < nameList.Count; index++)
//        {
//            sw.Write(string.Format("{0},", nameList[index]));
//        }

//        Type vec3Tp = typeof(Vector3);
//        Type enumTp = typeof(Enum);
//        Type colorTp = typeof(Color);
//        Type colorArrayTp = typeof(Color[]);


//        for (int i = 0; i < attrList.Count; i++)
//        {
//            List<object> value = attrList[i];
//            sw.WriteLine(string.Format(""));
//            for (int index = 0; index < value.Count; index++)
//            {
//                object target = value[index];
//                if (target == null)
//                {
//                    continue;
//                }
//                Type objT = target.GetType();
//                if (objT == vec3Tp || objT == colorTp)
//                {
//                    sw.Write(string.Format("\"{0}\",", target.ToString()));
//                }
//                else if (objT.IsEnum)
//                {
//                    //ProjectX.Interactions.VignetteInteractable+IndicatorState
//                    sw.Write(string.Format("枚举值：{0},", target.ToString()));
//                }
//                else
//                {
//                    //sw.Write(string.Format("{0},", value[index].ToString()));
//                    sw.Write(string.Format("{0},", target.ToString()));
//                }
//            }
//            EditorUtility.DisplayProgressBar("写入中", i.ToString() + "/" + count.ToString(), (i + 1) / count);
//        }
//        EditorUtility.ClearProgressBar();
//        sw.Flush();
//        sw.Close();
//        fs.Close();
//        npcList.Clear();
//    }
//    #endregion

//    #region 测试
//    //static void RecodeCommon(string url,string targetListType) {
//    //    if (File.Exists(url))
//    //    {
//    //        File.Delete(url);
//    //    }
//    //    List<T> targetList = null;
//    //    if (targetListType == "") {

//    //    }

//    //    FileStream fs = new FileStream(url, FileMode.Append);
//    //    StreamWriter sw = new StreamWriter(fs);
//    //    int count = targetList.Count;

//    //    //字段名列表
//    //    List<string> nameList = new List<string>();
//    //    //属性值列表
//    //    Dictionary<int, List<object>> attrList = new Dictionary<int, List<object>>();
//    //    for (int i = 0; i < targetList.Count; i++)
//    //    {
//    //        attrList.Add(i, new List<object>());

//    //        VignetteInteractable vi = targetList[i];
//    //        Type type = vi.GetType();
//    //        //ProjectX.Interactions.VignetteInteractable
//    //        FieldInfo[] fieldInfos = type.GetFields(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public);

//    //        bool shouldAddName = nameList.Count <= 0;

//    //        foreach (FieldInfo fi in fieldInfos)
//    //        {
//    //            if (shouldAddName)
//    //            {
//    //                nameList.Add(fi.Name);
//    //            }

//    //            attrList[i].Add(fi.GetValue(vi));
//    //        }

//    //        //collidersize
//    //        Collider col = vi.transform.GetComponentInChildren<Collider>();
//    //        Type colType = col.GetType();
//    //        object size = null;
//    //        if (colType == typeof(BoxCollider))
//    //        {
//    //            size = (col as BoxCollider).size;
//    //        }
//    //        else if (colType == typeof(SphereCollider))
//    //        {
//    //            size = (col as SphereCollider).radius;
//    //        }
//    //        //interactPoint
//    //        List<Vector3> interactsPos = new List<Vector3>();
//    //        List<Vector3> interactsRotation = new List<Vector3>();
//    //        for (int childIndex = 0; childIndex < vi.transform.childCount; childIndex++)
//    //        {
//    //            Transform child = vi.transform.GetChild(childIndex);
//    //            if (child.name.ToLower().Contains("interactpoint"))
//    //            {
//    //                interactsPos.Add(child.localPosition);
//    //                interactsRotation.Add(child.localRotation.eulerAngles);
//    //            }
//    //        }

//    //        //单独添加坐标，方向，boxCollider属性
//    //        if (shouldAddName)
//    //        {
//    //            nameList.Add("ColliderSize");
//    //            nameList.Add("ColliderPosition");
//    //            nameList.Add("ColliderType");

//    //            nameList.Add("InteractPointsPosition");
//    //            nameList.Add("InteractPointsRotation");

//    //            nameList.Add("position");
//    //            nameList.Add("rotation");
//    //            nameList.Add("name");
//    //            nameList.Add("sceneName");

//    //        }

//    //        attrList[i].Add(size);
//    //        attrList[i].Add(col.transform.localPosition);
//    //        attrList[i].Add(colType.Name);

//    //        //InteractPointsPosition/InteractPointsRotation
//    //        string str = "\"";
//    //        foreach (Vector3 v in interactsPos)
//    //        {
//    //            str += v.ToString() + ",";
//    //        }
//    //        str += "\"";
//    //        attrList[i].Add(str);

//    //        string str1 = "\"";
//    //        foreach (Vector3 v in interactsRotation)
//    //        {
//    //            str1 += v.ToString() + ",";
//    //        }
//    //        str1 += "\"";
//    //        attrList[i].Add(str1);

//    //        attrList[i].Add(vi.transform.localPosition);
//    //        attrList[i].Add(vi.transform.rotation.eulerAngles);
//    //        attrList[i].Add(vi.transform.name);
//    //        attrList[i].Add(UnityEngine.SceneManagement.SceneManager.GetActiveScene().name);


//    //    }
//    //    for (int index = 0; index < nameList.Count; index++)
//    //    {
//    //        sw.Write(string.Format("{0},", nameList[index]));
//    //    }

//    //    Type vec3Tp = typeof(Vector3);
//    //    Type enumTp = typeof(Enum);
//    //    Type colorTp = typeof(Color);
//    //    Type colorArrayTp = typeof(Color[]);


//    //    for (int i = 0; i < attrList.Count; i++)
//    //    {
//    //        List<object> value = attrList[i];
//    //        sw.WriteLine(string.Format(""));
//    //        for (int index = 0; index < value.Count; index++)
//    //        {
//    //            object target = value[index];
//    //            Type objT = target.GetType();
//    //            if (objT == vec3Tp || objT == colorTp)
//    //            {
//    //                sw.Write(string.Format("\"{0}\",", target.ToString()));
//    //            }
//    //            else if (objT.IsEnum)
//    //            {
//    //                //ProjectX.Interactions.VignetteInteractable+IndicatorState
//    //                //Debug.Log(objT);
//    //                sw.Write(string.Format("枚举值：{0},", target.ToString()));
//    //            }
//    //            else
//    //            {
//    //                //sw.Write(string.Format("{0},", value[index].ToString()));
//    //                sw.Write(string.Format("{0},", target.ToString()));
//    //            }
//    //        }
//    //        EditorUtility.DisplayProgressBar("写入中", i.ToString() + "/" + count.ToString(), (i + 1) / count);
//    //    }

//    //    EditorUtility.ClearProgressBar();
//    //    sw.Flush();
//    //    sw.Close();
//    //    fs.Close();
//    //    targetList.Clear();
//    //}
//    #endregion
//}
